package com.main.test;

public class CheckByteCRC {

    public static byte[] checkCRC(String str) {
        // 创建一个实现了 CheckSumCalculator 接口的对象
        CheckSumCalculatorByte calculator = new CheckSumByteImpl();
        //  A004018901将字符串，十六进制放入byte数组中
        // A004018901将字符串，十六进制放入byte数组中.A004018901将字符串，十六进制放入byte数组中();
        //byte[] buf = hexStringToByteArray("A004018901");
        byte[] buf = hexStringToByteArray(str);
        // 定义一个测试用的字节数组
        //  byte[] buffer = {1, 2, 3, 4, 5};
        System.out.print("初始数据：");
        for (int i = 0; i < buf.length; i++){
            System.out.print(buf[i]+",");
        }
        System.out.println();
        // 调用 calculateCheckSum 方法计算校验和
        byte checkSum = calculator.calculateCheckSum(buf);
        //生成新的数组
        byte[] newbuf=getNewBuf(buf,checkSum);
        System.out.println("得到crc校验的值十进制:"+checkSum);
        return newbuf;
    }
    public static byte[] checkCRC(byte[] buf) {
        // 创建一个实现了 CheckSumCalculator 接口的对象
        CheckSumCalculatorByte calculator = new CheckSumByteImpl();
        //  A004018901将字符串，十六进制放入byte数组中
        // A004018901将字符串，十六进制放入byte数组中.A004018901将字符串，十六进制放入byte数组中();
        //byte[] buf = hexStringToByteArray("A004018901");
        //byte[] buf = hexStringToByteArray(str);
        // 定义一个测试用的字节数组
        //  byte[] buffer = {1, 2, 3, 4, 5};
        System.out.print("初始数据：");
        for (int i = 0; i < buf.length; i++){
            System.out.print(buf[i]+",");
        }
        System.out.println();
        // 调用 calculateCheckSum 方法计算校验和
        byte checkSum = calculator.calculateCheckSum(buf);
        //生成新的数组
        byte[] newbuf=getNewBuf(buf,checkSum);
        System.out.println("得到crc校验的值十进制:"+checkSum);
        return newbuf;
    }
    private static byte[] getNewBuf(byte[] buf, byte checkSum) {
        byte[] newBuf=new byte[buf.length+1];
        // 复制原数组元素到新数组
        System.arraycopy(buf, 0, newBuf, 0, buf.length);
        // 添加新元素到新数组的末尾
        newBuf[newBuf.length - 1] = checkSum;
        System.out.print("校验后数据：");
        for (int i = 0; i < newBuf.length; i++){
            System.out.print(newBuf[i]+",");
        }
        return newBuf;
    }
    public static byte[] hexStringToByteArray(String hexString) {
        // 实现将十六进制字符串转换为字节数组的逻辑
        // 例如：
        int len = hexString.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
                    + Character.digit(hexString.charAt(i + 1), 16));
        }
        return data;
    }
}
// 定义一个计算校验和的接口
interface CheckSumCalculatorByte {
    //计算出校验的byte值
    byte calculateCheckSum(byte[] buffer);
    //将byte转为十六进制
    String  getHexbyByte(byte b);
}
// 实现 CheckSumCalculator 接口的类
class CheckSumByteImpl implements CheckSumCalculatorByte {
    @Override
    public byte calculateCheckSum(byte[] buffer) {
        int sum = 0;
        // 遍历字节数组，计算所有元素的和
        for (byte b : buffer) {
            // 由于 Java 中 byte 是有符号的，需要将其转换为无符号整数进行计算
            sum += b & 0xFF;
        }
        // 对和取反加 1
        sum = (~sum) + 1;
        // 取结果的低 8 位作为最终的校验和
        return (byte) (sum & 0xFF);
    }
    @Override
    public String getHexbyByte(byte checkSum) {
        System.out.println("校验和: " + checkSum);
        String hex = Integer.toHexString(checkSum & 0xFF);
        if (hex.length() == 1) {
            hex = "0" + hex;
        }
        System.out.println("-47 的十六进制是: " + hex.toUpperCase());
        String  checkNums= hex.toUpperCase();
        return checkNums;
    }
}